home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / share / pygtk / 2.0 / codegen / h2def.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2006-01-20  |  13KB  |  490 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import string
  5. import sys
  6. import re
  7. import types
  8. _upperstr_pat1 = re.compile('([^A-Z])([A-Z])')
  9. _upperstr_pat2 = re.compile('([A-Z][A-Z])([A-Z][0-9a-z])')
  10. _upperstr_pat3 = re.compile('^([A-Z])([A-Z])')
  11.  
  12. def to_upper_str(name):
  13.     '''Converts a typename to the equivalent upercase and underscores
  14.     name.  This is used to form the type conversion macros and enum/flag
  15.     name variables'''
  16.     name = _upperstr_pat1.sub('\\1_\\2', name)
  17.     name = _upperstr_pat2.sub('\\1_\\2', name)
  18.     name = _upperstr_pat3.sub('\\1_\\2', name, count = 1)
  19.     return string.upper(name)
  20.  
  21.  
  22. def typecode(typename):
  23.     '''create a typecode (eg. GTK_TYPE_WIDGET) from a typename'''
  24.     return string.replace(to_upper_str(typename), '_', '_TYPE_', 1)
  25.  
  26.  
  27. def strip_comments(buf):
  28.     parts = []
  29.     lastpos = 0
  30.     while None:
  31.         pos = string.find(buf, '/*', lastpos)
  32.         if pos >= 0:
  33.             parts.append(buf[lastpos:pos])
  34.             pos = string.find(buf, '*/', pos)
  35.             if pos >= 0:
  36.                 lastpos = pos + 2
  37.             else:
  38.                 break
  39.         parts.append(buf[lastpos:])
  40.         break
  41.     return string.join(parts, '')
  42.  
  43. obj_name_pat = '[A-Z][a-z]*[A-Z][A-Za-z0-9]*'
  44. split_prefix_pat = re.compile('([A-Z]+[a-z]*)([A-Za-z0-9]+)')
  45.  
  46. def find_obj_defs(buf, objdefs = []):
  47.     '''
  48.     Try to find object definitions in header files.
  49.     '''
  50.     buf = strip_comments(buf)
  51.     maybeobjdefs = []
  52.     pat = re.compile('struct _(' + obj_name_pat + ')\\s*{\\s*' + '(' + obj_name_pat + ')\\s+', re.MULTILINE)
  53.     pos = 0
  54.     while pos < len(buf):
  55.         m = pat.search(buf, pos)
  56.         if not m:
  57.             break
  58.         
  59.         maybeobjdefs.append((m.group(1), m.group(2)))
  60.         pos = m.end()
  61.     pat = re.compile('typedef struct\\s+[_\\w]*\\s*{\\s*' + '(' + obj_name_pat + ')\\s+[^}]*}\\s*' + '(' + obj_name_pat + ')\\s*;', re.MULTILINE)
  62.     pos = 0
  63.     while pos < len(buf):
  64.         m = pat.search(buf, pos)
  65.         if not m:
  66.             break
  67.         
  68.         maybeobjdefs.append((m.group(2), m.group(2)))
  69.         pos = m.end()
  70.     pat = re.compile('struct _(' + obj_name_pat + ')Class\\s*{\\s*' + '(' + obj_name_pat + ')Class\\s+', re.MULTILINE)
  71.     pos = 0
  72.     while pos < len(buf):
  73.         m = pat.search(buf, pos)
  74.         if not m:
  75.             break
  76.         
  77.         t = (m.group(1), m.group(2))
  78.         if t in maybeobjdefs:
  79.             objdefs.append(t)
  80.         
  81.         pos = m.end()
  82.     pat = re.compile('typedef struct\\s+[_\\w]*\\s*{\\s*' + '(' + obj_name_pat + ')Class\\s+[^}]*}\\s*' + '(' + obj_name_pat + ')Class\\s*;', re.MULTILINE)
  83.     pos = 0
  84.     while pos < len(buf):
  85.         m = pat.search(buf, pos)
  86.         if not m:
  87.             break
  88.         
  89.         t = (m.group(2), m.group(1))
  90.         if t in maybeobjdefs:
  91.             objdefs.append(t)
  92.         
  93.         pos = m.end()
  94.     pat = re.compile('struct _(' + obj_name_pat + ')Class\\s*{\\s*' + 'GTypeInterface\\s+', re.MULTILINE)
  95.     pos = 0
  96.     while pos < len(buf):
  97.         m = pat.search(buf, pos)
  98.         if not m:
  99.             break
  100.         
  101.         t = (m.group(1), '')
  102.         t2 = (m.group(1) + 'Class', 'GTypeInterface')
  103.         if t2 in maybeobjdefs:
  104.             objdefs.append(t)
  105.         
  106.         pos = m.end()
  107.     pat = re.compile('struct _(' + obj_name_pat + ')Iface\\s*{\\s*' + 'GTypeInterface\\s+', re.MULTILINE)
  108.     pos = 0
  109.     while pos < len(buf):
  110.         m = pat.search(buf, pos)
  111.         if not m:
  112.             break
  113.         
  114.         t = (m.group(1), '')
  115.         t2 = (m.group(1) + 'Iface', 'GTypeInterface')
  116.         if t2 in maybeobjdefs:
  117.             objdefs.append(t)
  118.         
  119.         pos = m.end()
  120.  
  121.  
  122. def sort_obj_defs(objdefs):
  123.     objdefs.sort()
  124.     pos = 0
  125.     while pos < len(objdefs):
  126.         (klass, parent) = objdefs[pos]
  127.         for i in range(pos + 1, len(objdefs)):
  128.             if objdefs[i][0] == parent:
  129.                 objdefs.insert(i + 1, objdefs[pos])
  130.                 del objdefs[pos]
  131.                 break
  132.                 continue
  133.         else:
  134.             pos = pos + 1
  135.     return objdefs
  136.  
  137.  
  138. def write_obj_defs(objdefs, output):
  139.     if type(output) == types.StringType:
  140.         fp = open(output, 'w')
  141.     elif type(output) == types.FileType:
  142.         fp = output
  143.     else:
  144.         fp = sys.stdout
  145.     fp.write(';; -*- scheme -*-\n')
  146.     fp.write('; object definitions ...\n')
  147.     for klass, parent in objdefs:
  148.         m = split_prefix_pat.match(klass)
  149.         cmodule = None
  150.         cname = klass
  151.         if m:
  152.             cmodule = m.group(1)
  153.             cname = m.group(2)
  154.         
  155.         fp.write('(define-object ' + cname + '\n')
  156.         if cmodule:
  157.             fp.write('  (in-module "' + cmodule + '")\n')
  158.         
  159.         if parent:
  160.             fp.write('  (parent "' + parent + '")\n')
  161.         
  162.         fp.write('  (c-name "' + klass + '")\n')
  163.         fp.write('  (gtype-id "' + typecode(klass) + '")\n')
  164.         fp.write(')\n\n')
  165.     
  166.  
  167.  
  168. def find_enum_defs(buf, enums = []):
  169.     buf = strip_comments(buf)
  170.     buf = re.sub('\n', ' ', buf)
  171.     enum_pat = re.compile('enum\\s*{([^}]*)}\\s*([A-Z][A-Za-z]*)(\\s|;)')
  172.     splitter = re.compile('\\s*,\\s', re.MULTILINE)
  173.     pos = 0
  174.     while pos < len(buf):
  175.         m = enum_pat.search(buf, pos)
  176.         if not m:
  177.             break
  178.         
  179.         name = m.group(2)
  180.         vals = m.group(1)
  181.         isflags = string.find(vals, '<<') >= 0
  182.         entries = []
  183.         for val in splitter.split(vals):
  184.             if not string.strip(val):
  185.                 continue
  186.             
  187.             entries.append(string.split(val)[0])
  188.         
  189.         if name != 'GdkCursorType':
  190.             enums.append((name, isflags, entries))
  191.         
  192.         pos = m.end()
  193.  
  194.  
  195. def write_enum_defs(enums, output = None):
  196.     if type(output) == types.StringType:
  197.         fp = open(output, 'w')
  198.     elif type(output) == types.FileType:
  199.         fp = output
  200.     else:
  201.         fp = sys.stdout
  202.     fp.write(';; Enumerations and flags ...\n\n')
  203.     trans = string.maketrans(string.uppercase + '_', string.lowercase + '-')
  204.     for cname, isflags, entries in enums:
  205.         name = cname
  206.         module = None
  207.         m = split_prefix_pat.match(cname)
  208.         if m:
  209.             module = m.group(1)
  210.             name = m.group(2)
  211.         
  212.         if isflags:
  213.             fp.write('(define-flags ' + name + '\n')
  214.         else:
  215.             fp.write('(define-enum ' + name + '\n')
  216.         if module:
  217.             fp.write('  (in-module "' + module + '")\n')
  218.         
  219.         fp.write('  (c-name "' + cname + '")\n')
  220.         fp.write('  (gtype-id "' + typecode(cname) + '")\n')
  221.         prefix = entries[0]
  222.         for ent in entries:
  223.             while ent[:len(prefix)] != prefix or len(prefix) >= len(ent):
  224.                 prefix = prefix[:-1]
  225.         
  226.         prefix_len = len(prefix)
  227.         fp.write('  (values\n')
  228.         for ent in entries:
  229.             fp.write('    \'("%s" "%s")\n' % (string.translate(ent[prefix_len:], trans), ent))
  230.         
  231.         fp.write('  )\n')
  232.         fp.write(')\n\n')
  233.     
  234.  
  235.  
  236. def clean_func(buf):
  237.     '''
  238.     Ideally would make buf have a single prototype on each line.
  239.     Actually just cuts out a good deal of junk, but leaves lines
  240.     where a regex can figure prototypes out.
  241.     '''
  242.     buf = strip_comments(buf)
  243.     pat = re.compile('\\\\\\n', re.MULTILINE)
  244.     buf = pat.sub('', buf)
  245.     pat = re.compile('^[#].*?$', re.MULTILINE)
  246.     buf = pat.sub('', buf)
  247.     pat = re.compile('^(typedef|struct|enum)(\\s|.|\\n)*?;\\s*', re.MULTILINE)
  248.     buf = pat.sub('', buf)
  249.     pat = re.compile('G_BEGIN_DECLS|BEGIN_LIBGTOP_DECLS', re.MULTILINE)
  250.     buf = pat.sub('', buf)
  251.     pat = re.compile('^\\s*(extern)\\s+\\"C\\"\\s+{', re.MULTILINE)
  252.     buf = pat.sub('', buf)
  253.     pat = re.compile('\\s+', re.MULTILINE)
  254.     buf = pat.sub(' ', buf)
  255.     pat = re.compile(';\\s*', re.MULTILINE)
  256.     buf = pat.sub('\n', buf)
  257.     buf = buf.lstrip()
  258.     pat = re.compile(' \\s* ([*|&]+) \\s* (\\w+)', re.VERBOSE)
  259.     buf = pat.sub('\\1 \\2', buf)
  260.     pat = re.compile('\\s+ (\\w+) \\[ \\s* \\]', re.VERBOSE)
  261.     buf = pat.sub('[] \\1', buf)
  262.     buf = string.replace(buf, 'G_CONST_RETURN ', 'const-')
  263.     buf = string.replace(buf, 'const ', 'const-')
  264.     return buf
  265.  
  266. proto_pat = re.compile('\n(?P<ret>(-|\\w|\\&|\\*)+\\s*)  # return type\n\\s+                   # skip whitespace\n(?P<func>\\w+)\\s*[(]   # match the function name until the opening (\n\\s*(?P<args>.*?)[)]     # group the function arguments\n', re.IGNORECASE | re.VERBOSE)
  267. arg_split_pat = re.compile('\\s*,\\s*')
  268.  
  269. def define_func(buf, fp, prefix):
  270.     buf = clean_func(buf)
  271.     buf = string.split(buf, '\n')
  272.     for p in buf:
  273.         if len(p) == 0:
  274.             continue
  275.         
  276.         m = proto_pat.match(p)
  277.         if m == None:
  278.             if verbose:
  279.                 sys.stderr.write('No match:|%s|\n' % p)
  280.                 continue
  281.             continue
  282.         
  283.         func = m.group('func')
  284.         if func[0] == '_':
  285.             continue
  286.         
  287.         ret = m.group('ret')
  288.         args = m.group('args')
  289.         args = arg_split_pat.split(args)
  290.         for i in range(len(args)):
  291.             spaces = string.count(args[i], ' ')
  292.             if spaces > 1:
  293.                 args[i] = string.replace(args[i], ' ', '-', spaces - 1)
  294.                 continue
  295.         
  296.         write_func(fp, func, ret, args, prefix)
  297.     
  298.  
  299. get_type_pat = re.compile('(const-)?([A-Za-z0-9]+)\\*?\\s+')
  300. pointer_pat = re.compile('.*\\*$')
  301. func_new_pat = re.compile('(\\w+)_new$')
  302.  
  303. def write_func(fp, name, ret, args, prefix):
  304.     if len(args) >= 1:
  305.         munged_name = string.replace(name, '_', '')
  306.         m = get_type_pat.match(args[0])
  307.         if m:
  308.             obj = m.group(2)
  309.             if munged_name[:len(obj)] == string.lower(obj):
  310.                 regex = string.join(map((lambda x: x + '_?'), string.lower(obj)), '')
  311.                 mname = re.sub(regex, '', name, 1)
  312.                 if prefix:
  313.                     l = len(prefix) + 1
  314.                     if mname[:l] == prefix and mname[l + 1] == '_':
  315.                         mname = mname[l + 1:]
  316.                     
  317.                 
  318.                 fp.write('(define-method ' + mname + '\n')
  319.                 fp.write('  (of-object "' + obj + '")\n')
  320.                 fp.write('  (c-name "' + name + '")\n')
  321.                 if ret != 'void':
  322.                     fp.write('  (return-type "' + ret + '")\n')
  323.                 else:
  324.                     fp.write('  (return-type "none")\n')
  325.                 is_varargs = 0
  326.                 has_args = len(args) > 1
  327.                 for arg in args[1:]:
  328.                     if arg == '...':
  329.                         is_varargs = 1
  330.                         continue
  331.                     if arg in ('void', 'void '):
  332.                         has_args = 0
  333.                         continue
  334.                 
  335.                 if has_args:
  336.                     fp.write('  (parameters\n')
  337.                     for arg in args[1:]:
  338.                         if arg != '...':
  339.                             tupleArg = tuple(string.split(arg))
  340.                             if len(tupleArg) == 2:
  341.                                 fp.write('    \'("%s" "%s")\n' % tupleArg)
  342.                             
  343.                         len(tupleArg) == 2
  344.                     
  345.                     fp.write('  )\n')
  346.                 
  347.                 if is_varargs:
  348.                     fp.write('  (varargs #t)\n')
  349.                 
  350.                 fp.write(')\n\n')
  351.                 return None
  352.             
  353.         
  354.     
  355.     if prefix:
  356.         l = len(prefix)
  357.         if name[:l] == prefix and name[l] == '_':
  358.             fname = name[l + 1:]
  359.         else:
  360.             fname = name
  361.     else:
  362.         fname = name
  363.     fp.write('(define-function ' + fname + '\n')
  364.     fp.write('  (c-name "' + name + '")\n')
  365.     m = func_new_pat.match(name)
  366.     if pointer_pat.match(ret) and m:
  367.         cname = ''
  368.         for s in m.group(1).split('_'):
  369.             cname += s.title()
  370.         
  371.         if cname != '':
  372.             fp.write('  (is-constructor-of "' + cname + '")\n')
  373.         
  374.     
  375.     if ret != 'void':
  376.         fp.write('  (return-type "' + ret + '")\n')
  377.     else:
  378.         fp.write('  (return-type "none")\n')
  379.     is_varargs = 0
  380.     has_args = len(args) > 0
  381.     for arg in args:
  382.         if arg == '...':
  383.             is_varargs = 1
  384.             continue
  385.         if arg in ('void', 'void '):
  386.             has_args = 0
  387.             continue
  388.     
  389.     if has_args:
  390.         fp.write('  (parameters\n')
  391.         for arg in args:
  392.             if arg != '...':
  393.                 tupleArg = tuple(string.split(arg))
  394.                 if len(tupleArg) == 2:
  395.                     fp.write('    \'("%s" "%s")\n' % tupleArg)
  396.                 
  397.             len(tupleArg) == 2
  398.         
  399.         fp.write('  )\n')
  400.     
  401.     if is_varargs:
  402.         fp.write('  (varargs #t)\n')
  403.     
  404.     fp.write(')\n\n')
  405.  
  406.  
  407. def write_def(input, output = None, prefix = None):
  408.     fp = open(input)
  409.     buf = fp.read()
  410.     fp.close()
  411.     if type(output) == types.StringType:
  412.         fp = open(output, 'w')
  413.     elif type(output) == types.FileType:
  414.         fp = output
  415.     else:
  416.         fp = sys.stdout
  417.     fp.write('\n;; From %s\n\n' % input)
  418.     buf = define_func(buf, fp, prefix)
  419.     fp.write('\n')
  420.  
  421. verbose = 0
  422.  
  423. def main(args):
  424.     global verbose
  425.     import getopt as getopt
  426.     onlyenums = 0
  427.     onlyobjdefs = 0
  428.     separate = 0
  429.     modulename = None
  430.     (opts, args) = getopt.getopt(args[1:], 'vs:m:', [
  431.         'onlyenums',
  432.         'onlyobjdefs',
  433.         'modulename=',
  434.         'separate='])
  435.     for o, v in opts:
  436.         if o == '-v':
  437.             verbose = 1
  438.         
  439.         if o == '--onlyenums':
  440.             onlyenums = 1
  441.         
  442.         if o == '--onlyobjdefs':
  443.             onlyobjdefs = 1
  444.         
  445.         if o in ('-s', '--separate'):
  446.             separate = v
  447.         
  448.         if o in ('-m', '--modulename'):
  449.             modulename = v
  450.             continue
  451.     
  452.     if not args[0:1]:
  453.         print 'Must specify at least one input file name'
  454.         return -1
  455.     
  456.     objdefs = []
  457.     enums = []
  458.     for filename in args:
  459.         buf = open(filename).read()
  460.         find_obj_defs(buf, objdefs)
  461.         find_enum_defs(buf, enums)
  462.     
  463.     objdefs = sort_obj_defs(objdefs)
  464.     if separate:
  465.         types = file(separate + '-types.defs', 'w')
  466.         methods = file(separate + '.defs', 'w')
  467.         write_obj_defs(objdefs, types)
  468.         write_enum_defs(enums, types)
  469.         types.close()
  470.         print 'Wrote %s-types.defs' % separate
  471.         for filename in args:
  472.             write_def(filename, methods, prefix = modulename)
  473.         
  474.         methods.close()
  475.         print 'Wrote %s.defs' % separate
  476.     elif onlyenums:
  477.         write_enum_defs(enums, None)
  478.     elif onlyobjdefs:
  479.         write_obj_defs(objdefs, None)
  480.     else:
  481.         write_obj_defs(objdefs, None)
  482.         write_enum_defs(enums, None)
  483.         for filename in args:
  484.             write_def(filename, None, prefix = modulename)
  485.         
  486.  
  487. if __name__ == '__main__':
  488.     sys.exit(main(sys.argv))
  489.  
  490.